﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using EFramework.Web.TypeExtension;
using System.Web.Services;
using RzCorportativo.Lib;

namespace RzCorportativo.Views.Cadastros
{
    [Lib.Permissao(HasValidation = true)]
    public partial class Indicacao : BasePage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (this.IsPostBack)
                return;
            this.VagaId.Value = this.Request.QueryString["vagaId"];
            this.Nome.Attributes.Add("url", this.ResolveUrl("~/Views/Cadastros/indicacao.aspx/Listar"));
            this.Indicacoes.Load(Lib.Indicacao.Listar(new Lib.Indicacao() { VagaId = LongExtension.Parse(this.Request.QueryString["vagaId"], 0) }).Where(f => f.Status != 4).OrderByDescending(f => f.DataCadastro).ToList());

            Func<Lib.Indicacao, bool> func = (indicacao) =>
            {
                return indicacao.ResultadoFinal == 1 && (indicacao.Status == 1 || indicacao.Status == 2);
            };
            Action<Lib.Indicacao, ButtonItem<Lib.Indicacao>> action = (indicacao, item) =>
            {
                if (indicacao.Status == 1 || indicacao.Status == 2)
                    item.OnClientClick = "Cancelar(" + indicacao.VagaId + ", " + indicacao.UsuarioIndicadoId + ", { Day: " + indicacao.DataCadastro.Day +
                        ", Month: " + indicacao.DataCadastro.Month + ", Year: " + indicacao.DataCadastro.Year + "}, this);";
            };
            this.Indicacoes.AddButton(new ButtonItem<Lib.Indicacao>() { Type = "button", Id = "btnRecuar", CssClass = "btn btn-danger", Text = "cancelar", OnCreateValidation = func, OnCreate = action });
            var vaga = new Lib.Vaga() { VagaId = LongExtension.Parse(this.Request.QueryString["vagaId"], 0) };
            if (vaga.VagaId != 0)
            {
                vaga = Lib.Vaga.Listar(vaga).FirstOrDefault();
                if (vaga != null)
                {
                    this.Cargo.Text = vaga.Cargo.Nome;
                    this.Empresa.Text = vaga.Usuario.Nome;
                    this.Salario.Text = (vaga.SalarioOferecido ?? 0).ToString("C");
                }
            }
        }

        [WebMethod]
        public static List<Lib.Login> Listar(string termo)
        {
            return Lib.Login.Listar(new Lib.Login()
            {
                Usuario = new Lib.Usuario() { Nome = termo },
                TipoLogin = Lib.TipoLogin.Candidato
            });
        }

        [WebMethod]
        public static object AddUsuario(Lib.Indicacao indicacao)
        {
            indicacao.ResultadoFinal = 1;
            indicacao.Status = 1;
            indicacao.DataCadastro = DateTime.MinValue.Date;
            indicacao.UsuarioIndicadorId = (AppSession.Login != null && AppSession.Login.Usuario != null ? AppSession.Login.Usuario.UsuarioId : 0);
            var resultado = SalvarIndicacao(indicacao, (result) =>
            {
                var newIndication = Lib.Indicacao.Listar(indicacao).FirstOrDefault();
                if (newIndication == null || AppSession.Login == null || AppSession.Login.Usuario == null)
                    return;
                Lib.Usuario candidato = Lib.Usuario.CreateInstace(indicacao.UsuarioIndicadoId);
                if (candidato != null)
                {
                    Lib.Login login = new Lib.Login();
                    login.LoginId = candidato.LoginId;
                    candidato.Login.Notificar(new Notificacao()
                    {
                        TipoNotificacao = "A",
                        Titulo = "INDICAÇÃO",
                        Menssagem = "Você foi indicado a vaga: <strong>" + newIndication.Vaga.Cargo.Nome + "</strong>"
                    });
                };
                //var coodenador = Lib.Usuario.CreateInstace(newIndication.UsuarioIndicadorId);
                //if (coodenador != null && candidato != null)
                //{
                //    Lib.Login login = newIndication.Vaga.Usuario.Login;
                //    login.LoginId = coodenador.LoginId;
                //    login.Notificar(new Notificacao()
                //    {
                //        TipoNotificacao = "A",
                //        Titulo = "INDICAÇÃO DE CANDIDATO",
                //        Menssagem = "O candidato <strong>" + candidato.Nome + "</strong><br/><br/>foi indicado a vaga: <strong>" + newIndication.Vaga.Cargo.Nome + "</strong>"
                //    });
                //};
            });
            return resultado;
        }

        [WebMethod]
        static object RemoverUsuario(int loginId, int grupoId)
        {
            Lib.Grupo grupo = new Lib.Grupo();
            grupo.GrupoId = grupoId;
            var usuarioId = (AppSession.Login.Usuario ?? new Lib.Usuario()).UsuarioId;
            try
            {
                string erros = string.Empty;
                if (grupo.GrupoId.Equals(-1))
                    erros += "Grupo inválido";
                if (loginId.Equals(-1))
                    erros += "Login inválido";
                if (usuarioId.Equals(0))
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Usuário inválido, favor fazer login novamente";
                if (erros.Length > 0)
                    return new
                    {
                        AlertType = 1,
                        Messages = erros.Split(';'),
                        Show = true,
                        Value = 0
                    };

                if (grupo.RemoveUser(new Lib.Login() { LoginId = loginId }))
                {
                    return new
                    {
                        AlertType = 0,
                        Messages = new string[] { "Item salvo com sucesso!" },
                        Show = true,
                        Value = new Lib.Login() { LoginId = loginId }
                    };
                }
                else
                {
                    return new
                    {
                        AlertType = 1,
                        Messages = new string[] { "Desculpe isto é vergonhoso", "Não foi possível salvar esta configuração, tente mais tarde!" },
                        Show = true
                    };
                }
            }
            catch (Exception ex)
            {
                return new
                {
                    AlertType = 1,
                    Messages = new string[] { ex.Message },
                    Show = true
                };
            }
        }

        [WebMethod]
        public static object Aprovar(Lib.Indicacao indicacao)
        {
            indicacao.ResultadoFinal = 1;
            indicacao.Status = 2;
            indicacao.DataCadastro = indicacao.DataCadastro.Date;
            return SalvarIndicacao(indicacao, (result) =>
            {
                if (AppSession.Login != null && AppSession.Login.Usuario != null)
                {
                    var newIndicacao = Lib.Indicacao.Listar(indicacao).FirstOrDefault();
                    if (newIndicacao != null)
                    {
                        var idUsuario = newIndicacao.UsuarioIndicadorId;
                        var empresadioId = newIndicacao.Vaga.UsuarioId;
                        var login = Lib.Login.Listar(new Lib.Login() { UsuarioId = idUsuario }).FirstOrDefault();
                        var loginEmpresario = Lib.Login.Listar(new Lib.Login() { UsuarioId = empresadioId }).FirstOrDefault();
                        login.Notificar(new Notificacao()
                        {
                            Login = login,
                            Titulo = "INDICAÇÃO APROVADA",
                            EnviarEmail = true,
                            Menssagem = "O usuário: <strong>" + AppSession.Login.Usuario.Nome + "</strong><br/> aprovou a indicação a vaga: <strong>" + newIndicacao.Vaga.Cargo.Nome + "</strong><br/>",
                            TipoNotificacao = "A"
                        });
                        loginEmpresario.Notificar(new Notificacao()
                        {
                            Login = loginEmpresario,
                            Titulo = "INDICAÇÃO APROVADA",
                            EnviarEmail = true,
                            Menssagem = "O usuário: <strong>" + AppSession.Login.Usuario.Nome + "</strong><br/> aprovou uma indicação a vaga: <strong>" + newIndicacao.Vaga.Cargo.Nome + "</strong><br/> que voce postou!",
                            TipoNotificacao = "A"
                        });
                    }
                }
            });
        }

        [WebMethod]
        public static object Reprovar(Lib.Indicacao indicacao)
        {
            indicacao.ResultadoFinal = 1;
            indicacao.Status = 3;
            indicacao.DataCadastro = indicacao.DataCadastro.Date;
            return SalvarIndicacao(indicacao, (result) =>
            {
                var login = Lib.Login.Listar(new Lib.Login() { UsuarioId = indicacao.UsuarioIndicadorId }).FirstOrDefault();
                if (login != null)
                {
                    var newIndicacao = Lib.Indicacao.Listar(new Lib.Indicacao()
                    {
                        DataCadastro = indicacao.DataCadastro,
                        VagaId = indicacao.VagaId,
                        UsuarioIndicadoId = indicacao.UsuarioIndicadoId,
                        Vaga = new Lib.Vaga()
                        {
                            VagaId = indicacao.VagaId
                        },
                        UsuarioIndicado = new Lib.Usuario()
                        {
                            UsuarioId = indicacao.UsuarioIndicadoId
                        }
                    }).FirstOrDefault();
                    login.Notificar(new Notificacao()
                    {
                        Login = login,
                        Titulo = "INDICAÇÃO REPROVADA",
                        EnviarEmail = true,
                        Menssagem = "O usuário: <strong>" + AppSession.Login.Usuario.Nome + "</strong><br/> reprovou a indicação a vaga: <strong>" + newIndicacao.Vaga.Cargo.Nome + "</strong><br/>",
                        TipoNotificacao = "A"
                    });
                }
            });
        }

        [WebMethod]
        public static object Cancelar(Lib.Indicacao indicacao)
        {
            indicacao.ResultadoFinal = 1;
            indicacao.Status = 4;
            indicacao.DataCadastro = indicacao.DataCadastro.Date;
            return SalvarIndicacao(indicacao, (result) =>
            {
                var newIndication = Lib.Indicacao.Listar(indicacao).FirstOrDefault();
                if (newIndication == null || AppSession.Login == null || AppSession.Login.Usuario == null)
                    return;
                Lib.Usuario.Listar(new Lib.Usuario() { UsuarioId = newIndication.UsuarioIndicadoId }).ForEach(usuario =>
                {
                    Lib.Login login = usuario.Login;
                    login.LoginId = usuario.LoginId;
                    login.Notificar(new Notificacao()
                            {
                                TipoNotificacao = "A",
                                Titulo = "CANCELAMENTO DE INDICAÇÃO",
                                Menssagem = "A indicação do usuário: <strong>" + usuario.Nome + "</strong><br/>Foi cancelada pelo usuário: <strong>" + AppSession.Login.Usuario.Nome + "</strong>"
                            });
                });
            });
        }

        [WebMethod]
        public static object AprovarAluno(Lib.Indicacao indicacao, string feedback)
        {
            indicacao.ResultadoFinal = 2;
            indicacao.Status = 2;
            indicacao.DataCadastro = indicacao.DataCadastro.Date;
            Feedback feed = new Feedback();
            feed.VagaId = indicacao.VagaId;
            //feed.UsuarioIndicadoId = (long)0;
            feed.Comentario = feedback;
            feed.UsuarioPostId = (AppSession.Login != null && AppSession.Login.Usuario != null ? AppSession.Login.Usuario.UsuarioId : 0);
            //feed.DataPostagem = DateTime.Now.Date;
            indicacao.AddFeedback(feed);
            return SalvarIndicacao(indicacao, (result) =>
                {
                    var newIndication = Lib.Indicacao.Listar(indicacao).FirstOrDefault();
                    if (newIndication == null || AppSession.Login == null || AppSession.Login.Usuario == null)
                        return;
                    Lib.Usuario candidato = Lib.Usuario.CreateInstace(newIndication.UsuarioIndicadoId);
                    if (candidato != null)
                    {
                        Lib.Login login = candidato.Login ?? new Lib.Login();
                        login.LoginId = candidato.LoginId;
                        login.Notificar(new Notificacao()
                        {
                            TipoNotificacao = "A",
                            Titulo = "APROVADO",
                            Menssagem = "<strong>Parabéns</strong><br/>Você foi aprovado a vaga: <strong>" + newIndication.Vaga.Cargo.Nome + "</strong>"
                        });
                    };
                    if (newIndication.UsuarioIndicadorId == newIndication.UsuarioIndicadoId)
                        return;
                    var coodenador = Lib.Usuario.CreateInstace(newIndication.UsuarioIndicadorId);
                    if (coodenador != null && candidato != null)
                    {
                        Lib.Login login = coodenador.Login ?? new Lib.Login();
                        login.LoginId = coodenador.LoginId;
                        login.Notificar(new Notificacao()
                        {
                            TipoNotificacao = "A",
                            Titulo = "APROVAÇÃO DE CANDIDATO",
                            Menssagem = "O candidato <strong>" + candidato.Nome + "</strong><br/><br/>foi aprovado a vaga: <strong>" + newIndication.Vaga.Cargo.Nome + "</strong>"
                        });
                    };
                });
        }

        [WebMethod]
        public static object ReprovarAluno(Lib.Indicacao indicacao, string feedback)
        {
            indicacao.ResultadoFinal = 3;
            indicacao.Status = 2;
            indicacao.DataCadastro = indicacao.DataCadastro.Date;
            Feedback feed = new Feedback();
            feed.VagaId = indicacao.VagaId;
            feed.UsuarioIndicadoId = (long)0;
            feed.Comentario = feedback;
            feed.UsuarioPostId = (AppSession.Login != null && AppSession.Login.Usuario != null ? AppSession.Login.Usuario.UsuarioId : 0);
            //feed.DataPostagem = DateTime.Now.Date;
            indicacao.AddFeedback(feed);
            return SalvarIndicacao(indicacao, (result) =>
            {
                var newIndication = Lib.Indicacao.Listar(indicacao).FirstOrDefault();
                if (newIndication == null || AppSession.Login == null || AppSession.Login.Usuario == null)
                    return;
                Lib.Usuario candidato = Lib.Usuario.CreateInstace(newIndication.UsuarioIndicadoId);

                var coodenador = Lib.Usuario.CreateInstace(newIndication.UsuarioIndicadorId);
                if (coodenador != null && candidato != null)
                {
                    Lib.Login login = coodenador.Login ?? new Lib.Login();
                    login.LoginId = coodenador.LoginId;
                    login.Notificar(new Notificacao()
                    {
                        TipoNotificacao = "A",
                        Titulo = "RESULTADO PROCESSO SELETIVO",
                        Menssagem = 
                        (newIndication.UsuarioIndicadorId == newIndication.UsuarioIndicadoId ? 
                        "Prezado(a) candidato: " + candidato.Nome + ".<br />Agradecemos seu interesse e participação no processo seletivo para a vaga " + newIndication.Vaga.Cargo.Nome + ", mas seu perfíl não foi aprovado para esta vaga." :
                        "O candidato <strong>" + candidato.Nome + "</strong><br/><br/>não foi aprovado a vaga: <strong>" + newIndication.Vaga.Cargo.Nome + "</strong><br/> consulte o feedback postado pelo avaliador e obtenha mais detalhes")
                    });
                };
            });
        }

        private static object SalvarIndicacao(Lib.Indicacao indicacao, Action<Lib.Indicacao> OnSuccess = null)
        {
            var loginId = (AppSession.Login ?? new Lib.Login()).LoginId;
            try
            {
                string erros = string.Empty;
                if (indicacao.VagaId.Equals(-1))
                    erros += "Vaga inválida";
                if (indicacao.UsuarioIndicadoId.Equals(-1))
                    erros += "Usuário inválido";
                if (loginId.Equals(0))
                    erros += (erros.Length > 0 ? ";" : string.Empty) + "Usuário inválido, favor fazer login novamente";
                if (erros.Length > 0)
                    return new
                    {
                        AlertType = 1,
                        Messages = erros.Split(';'),
                        Show = true,
                        Value = 1
                    };
                if (indicacao.Salvar())
                {
                    if (OnSuccess != null)
                        OnSuccess(indicacao);
                    return new
                    {
                        AlertType = 0,
                        Messages = new string[] { "Item salvo com sucesso!" },
                        Show = true,
                        Value = Lib.Login.CreateInstance(loginId)
                    };
                }
                else
                {
                    return new
                    {
                        AlertType = 1,
                        Messages = new string[] { "Desculpe isto é vergonhoso", "Não foi possível salvar esta configuração, tente mais tarde!" },
                        Show = true
                    };
                }
            }
            catch (Exception ex)
            {
                return new
                {
                    AlertType = 1,
                    Messages = new string[] { ex.Message },
                    Show = true
                };
            }
        }
    }
}